package pl.cezary.butler.walili.client;

import pl.cezary.butler.walili.client.gui.GUI;
import pl.cezary.butler.walili.common.IServerFacadeRemote;
import pl.cezary.butler.walili.common.Task;
import pl.cezary.butler.walili.common.Query;
import java.awt.event.ActionEvent;
import java.rmi.RemoteException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class QueryControler extends BaseControler {

    public static final String SEND = "wyslij"; //jakiego typu bedzie cel?
    private static final Pattern Z_POLOZENIE_PATTERN = Pattern.compile("(f|ht)tp://([a-z0-9-_!?/]+\\.)+[a-z]{2,4}(/[a-z0-9-_!?]+)*", Pattern.CASE_INSENSITIVE);//FIXME do poprawienia http://localhost to tez poprawny url a nie przejdzie
    private static final Pattern Z_CEL_PATTERN = Z_POLOZENIE_PATTERN;
    private static final Logger log = Logger.getLogger("KontrolerZapytan");

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.3D565345-6B3C-D87C-BF05-5875DFBE400B]
    // </editor-fold> 
    public QueryControler() {
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        final String polecenie = arg0.getActionCommand();
        if (SEND.equals(polecenie)) {
            // log.log(Level.INFO,"Wywoluje funkcje wyslij() dla zapytania");
            send();
        } else {
            log.log(Level.SEVERE, "Podano nieznane polecenie dla kontrolera zapytań");
        }
    }

    private boolean validateQueryTarget(String cel) {
        /*Matcher celMatcher = Z_CEL_PATTERN.matcher(cel);
        if (!celMatcher.matches()) {
            log.log(Level.INFO, "Podano b\u0142\u0119dny cel zapytania: {0}", cel);
            getZrodloDanych().alert(GUI.getLocalized("queryCtl.wrong_task"));
            return false;
        }*/
        return true;
    }

    private boolean validateQueryLocation(String polozenie) {
        /*Matcher polozenieMatcher = Z_POLOZENIE_PATTERN.matcher(polozenie);
        if (!polozenieMatcher.matches()) {
            log.log(Level.INFO, "Podano b\u0142\u0119dny po\u0142o\u017cenie zapytania: {0}", polozenie);
            getZrodloDanych().alert(GUI.getLocalized("queryCtl.wrong_target"));
            return false;
        }*/
        return true;
    }

    private void send() {
        final UserDataSource z = getZrodloDanych();
        try {
            String zapytanie_cel = z.getQueryTarget();
            String zapytanie_polozenie = z.getQueryLocation();
            if ((zapytanie_cel.isEmpty() || validateQueryTarget(zapytanie_cel)) && (zapytanie_polozenie.isEmpty() || validateQueryLocation(zapytanie_polozenie))) {
                IServerFacadeRemote fasada = getFasada();
                if (fasada != null) {
                    log.log(Level.FINEST, "Query was send");
                    final Query pytanie = new Query(zapytanie_cel, zapytanie_polozenie, z.getQueryStatus());
                    final List<Task> wynik = fasada.processQuery(pytanie);
                    if(log.isLoggable(Level.FINE))
                        log.log(Level.FINE, "Query {0} result has {0}",new Object[]{pytanie, wynik.size()});
                    z.setWynikZapytania(wynik);
                    return;

                } else {
                    z.alert(GUI.getLocalized("loginCtl.connection_error"));
                    log.log(Level.SEVERE, "Server facade error, there's no facade");
                    return;
                }
            }
        } catch (RemoteException e) {
            log.log(Level.WARNING, "Error occured while query was being send", e);
        }
    }

    @Override
    public void connectDataSource(UserDataSource z) {
        super.connectDataSource(z);
        z.podlaczKontrolerZapytan(this);
    }
}

